// malloc 动态分配内存

#include <stdio.h>
// malloc 需要 stdlib
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    // void* malloc(size_t, size)
    int number;
    scanf("%d\n", &number);
    // int a[number];
    // malloc 是 void* 类型的，要强制类型转换为 int
    // 如果不转换，会报warning
    // 如果申请失败，会返回NULL（0）
    int* a = (int*)malloc(number * sizeof(int));
    for (int i = 0; i < number; i++)
    {
        scanf("%d", &a[i]);
    }
    for (int i = number - 1; i > -1; i--)
    {
        printf("%d\n", a[i]);
    }
    // 使用完后要释放内存
    free(a);

    int cnt = 0;
    void* p;
    // while ((p = malloc(100 * 1024 * 1024)))
    // {
    //     cnt++;
    // }
    // // 分配了5300MB
    // printf("分配了%d00MB空间\n", cnt);
    // free(p);


    // free 只能还申请空间的首地址！
    int i;
    // p = &i;
    // 此时free会导致程序崩溃
    // free(p);

    // 这样free也会崩溃
    // p = malloc(100 * 1024 * 1024);
    // p++;
    // free(p);

    // free(NULL)不会报错
    // 好习惯：把指针初始化为0
    free(NULL);
    free(0);
    printf("Succeed\n");

    // malloc 和 free 要一一对应！
    
    return 0;
}